package mystudy
// 结构体嵌入知识点
import "fmt"
type Animal struct{
	Name string
	Age int
}

func getAnimal(name string, age int)*Animal{
	return &Animal{name, age}
}


func(a Animal) eat(){
	fmt.Println(a.Name, "吃东西")
}


type Dog struct{
	Animal // 嵌入结构体
	weight int 
}

func (d Dog) call(){
	fmt.Println(d.Name,"叫了一声，说她的体重是：",d.weight)
}
func (d *Dog) setWight(weight int){
	(*d).weight = weight
	fmt.Println(d.weight)
}

type cat struct{
	a Animal
	high int 
}


func DemoQianru(){
	// 声明方式1
	var d Dog = Dog{Animal{"花花", 22}, 108}
	fmt.Println(d)
	// 声明方式2
	// 在 Go 语言中，结构体的字段初始化可以按照顺序进行赋值。
	// 但是在嵌套结构体中，如果嵌入的结构体没有指定字段名，
	// 那么在初始化时不能省略字段名。
	var d2 Dog = Dog{Animal:Animal{"兰兰", 22}, weight:108}
	fmt.Println(d2)
	d.setWight(99)
	fmt.Println(d)
	var d3 *Dog = &Dog{Animal:Animal{"雨雨", 22}, weight:108}
	(*d3).setWight(98)
	fmt.Println((*d3))
	fmt.Println(d3.Animal.Name)
	fmt.Println(d3.Name)
	fmt.Println((*d3).Name)
	fmt.Println("------结构体嵌入，当作类型------")
	var c1 = cat{Animal{"猫猫", 19}, 180}
	fmt.Println(c1)
	// 此语句无法调用，会报错
	// 16.结构体嵌入.go:59:17: c1.Name undefined (type cat has no field or method Name)
	// fmt.Println(c1.Name)
	// 使用以下带调用
	fmt.Println(c1.a.Name)
}